const fs = require('fs');
// 导入文件模块
// node 读写文件也有同步和异步的接口! node 里面默认的就是异步的操作！

// 同步 的方式读取文件 会产生等待或阻塞！
const fd = fs.openSync('lvhang2.txt', 'r');
// 返回表示文件描述符的整数。
// console.log(fd); // 4

// 读取文件中的内容！
const buf = new Buffer.alloc(20);
// const content = fs.readSync(fd, buf, 0, 20, 0);
// 高度封装版！
// var content = fs.readFileSync('lvhang2.txt', { flag: 'r', encoding: 'utf-8' });
var content = fs.readFileSync('lvhang2.txt', { flag: 'r' });
// 如果不设置编码的化， 最开始打印的内容你是看不懂的！有缓冲区， 得转换成字符串类型才可以显示源文件的内容！
// console.log(content) // <Buffer e5 90 95 e6 88 90 e9 91 ab ef bc 81> 缓冲区！
// console.log(content.toString()) // lvhang2.txt里的内容



// 异步操作读取文件
// 同样的 第一个参数是地址， 第二个是 编码方式【可选项！】， 回调函数！
// fs.readFile('lvhang.txt', { encoding: 'utf-8', flag: 'r' }, function(err, data) {
//         if (err != null) {
//             console.log(err)
//         } else {
//             console.log(data); // 成功获取到文件！

//         }
//     })
// 上面异步文件读取的操作， 不会阻塞下面同步代码的执行， 当文件读取成功之后就会自动调用回调函数， 从而打印出读取文件的结果！
//  结果就是 先输出 同步代码的输出结果211 然后在输出 回调函数的结果
// console.log(211)



function fsRead(path) {
    return new Promise(function(resolve, reject) {
        fs.readFile(path, { encoding: 'utf-8', flag: 'r' }, function(err, data) {
            if (err != null) {
                // console.log(err)
                // 失败执行的内容
                reject(err);
            } else {
                // console.log(data);
                // 成功获取到文件！
                resolve(data);
            }
        })
    })
}

// 对上上面的操作 进行封装 简化操作，俗称优化！
var s = fsRead('lvhang.txt');
// 返回回来的是一个Promise对象 要用专门的语法进行接收偶！
s.then(function(res) {
        // console.log(res) // 即将要写入的文件的内容！- 用拼接的方式来获得完整的路径！
    })
    // console.log(s); // Promise { <pending> }


// 再次进行优化
async function readList() {
    var lvhang2 = await fsRead('lvhang.txt');
    console.log(lvhang2)
    var lvhang3 = await fsRead('lvhang2.txt')
    console.log(lvhang3)
    var lvhang3Content = await fsRead('lvhang3.txt')
    console.log(lvhang3Content)
}

readList();